﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TwoDimencionArrays
{
    class Program
    {
        static void Main(string[] args)
        {
            string finalChoice;
            do
            {
                Console.Clear();
                Console.WriteLine(@"Пожалуйста, укажите номер приложения, которое хотите запустить:
1 - Замена 5 элемента каждой строки массива суммой предыдущих элементов строки;
2 - Поиск суммы всех элементов массива, находящихся на главной дигонали;
3 - Календарь;
4 - Подсчет количества четных и нечетных значени массива;
5 - Подсчет максимального значения среди минимальных элементов каждого столбца;
6 - Подсчет суммы элементов по столбцам и по строкам;
7 - Поиск максимальной суммы по строкам и номера строки с максимальной суммой значений элементов;
8 - Подсчет произведеия ненулевых индексов массива.");
                Console.Write("Задание # ");
                //int varChoice = Int32.Parse(Console.ReadLine());
                int varChoice;
                bool incorChoice = Int32.TryParse(Console.ReadLine(), out varChoice);
                switch (varChoice)
                {
                    case 1:
                        UpdateTheLastElemetOfTheRow();
                        break;
                    case 2:
                        SummCalculatingOfMainDiagonal();
                        break;
                    case 3:
                        Calendar();
                        break;
                    case 4:
                        CountOfEvenOddValues();
                        break;
                    case 5:
                        FindMaxValueFromTheMinValues();
                        break;
                    case 6:
                        SumOfElementsOfColumnsAndRows();
                        break;
                    case 7:
                        FindIndxOfRowWithMaxSumm();
                        break;
                    case 8:
                        ProducOfNotZeroValues();
                        break;
                    default:
                        if (incorChoice == false || varChoice <= 0)
                        {
                            Console.WriteLine("Некорректный ввод!");
                        }
                        else
                        {
                            Console.WriteLine("Выбран несуществующий вариант!");
                        }
                        break;
                }
                Console.WriteLine("\nЖелаете повторить выбор задания? Y - Да, N - нет.");
                do
                {
                    finalChoice = Console.ReadLine();
                    if (finalChoice != "Y" && finalChoice != "N")
                    {
                        Console.WriteLine("Некорректный ввод! Введите Y или N.");
                    }
                } while (finalChoice != "Y" && finalChoice != "N");
            } while (finalChoice == "Y");
            Console.WriteLine("\nСпасибо за внимание. До свидания!");
        }

        static int[,] SizeAndRangeOfInitialArray()
        {
            Console.WriteLine("Enter the size of array.\nEnter the count of rows: ");
            int countOfRows = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Enter the count of columns: ");
            int countOfColumns = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Enter the range of values.\nEnter the lower border: ");
            int lowerBorder = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Enter the upper border: ");
            int upperBorder = Int32.Parse(Console.ReadLine());
            int[,] array = new int[countOfRows, countOfColumns];
            Random rnd = new Random();

            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    array[i, j] = rnd.Next(lowerBorder, upperBorder);
                }
            }
            return array;
        }


        static void ArrayToPrintTwoDemencions(int[,] arrayToPrint)
        {
            for (int i = 0; i < arrayToPrint.GetLength(0); i++)
            {
                for (int j = 0; j < arrayToPrint.GetLength(1); j++)
                {
                    Console.Write("{0}\t", arrayToPrint[i, j]);
                }
                Console.WriteLine();
            }
        }

        static void UpdateTheLastElemetOfTheRow()
        {
            
            int[,] firstArray = SizeAndRangeOfInitialArray();
            int[,] finalArray = firstArray;
            Console.WriteLine("Initial array:");
            ArrayToPrintTwoDemencions(firstArray);
            Console.WriteLine("Result array:");
            DoFirstTask(finalArray);
            ArrayToPrintTwoDemencions(finalArray);
        }

        static void SummCalculatingOfMainDiagonal()
        {
            int[,] firstArray = SizeAndRangeOfInitialArray();
            if (firstArray.GetLength(0) != firstArray.GetLength(1))
            {
                Console.WriteLine("This array is not square!");
            }
            else
            {
                
                Console.WriteLine("Initial array:");
                ArrayToPrintTwoDemencions(firstArray);
                int sumOfElementsMainDiagonal = SumOfMainDiagonal(firstArray);
                Console.WriteLine("The summ of elements located on the main diagonal is: {0}", sumOfElementsMainDiagonal);
            }
        }

        static int SumOfMainDiagonal(int[,] finalArray)
        {
            int sumOfElementsMainDiagonal = 0;
            int i, j;
            for (i = 0, j = 0; i < finalArray.GetLength(0); i++, j++)
            {
                sumOfElementsMainDiagonal += finalArray[i, j];
            }
            return sumOfElementsMainDiagonal;
        }

        static int[,] DoFirstTask(int[,] finalArray)
        {

            for (int i = 0; i < finalArray.GetLength(1); i++)
            {
                int sumRownElementsTillLast = 0;
                for (int j = 0; j < finalArray.GetLength(1) - 1; j++)
                {
                    sumRownElementsTillLast += finalArray[i, j];
                }
                finalArray[i, finalArray.GetLength(1) - 1] = sumRownElementsTillLast;
            }
            return finalArray;
        }

       

        static void Calendar()
        {
            int maxDaysOfMonth;
            do
            {
                Console.WriteLine("Please choose the amount of days in month");
                maxDaysOfMonth = Int32.Parse(Console.ReadLine());
                if (maxDaysOfMonth > 31 || maxDaysOfMonth <= 0)
                {
                    Console.WriteLine("Incorrect amount of days. Choose correct please!");
                }
            } while (maxDaysOfMonth > 31 || maxDaysOfMonth <= 0);

            string[] WeekDays = { "Mon", "Tue", "Wed", "Thur", "Frd", "Sut", "Sun" };
            int[,] monthCalendar = new int[6, 7];
            int dayOfMonth = 1;
            Console.WriteLine("Please choose the day of week when new month is started: \nMon, Tue, Wed, Thur, Frd, Sut, Sun.");
            string dayStartMonth = Console.ReadLine();
            int startDay = Array.IndexOf(WeekDays, dayStartMonth);

            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                    if (j < startDay && i == 0)
                    {
                        monthCalendar[i, j] = 0;
                    }
                    else if (dayOfMonth <= maxDaysOfMonth)
                    {
                        monthCalendar[i, j] = dayOfMonth++;
                    }
                }
            }
            for (int i = 0; i < WeekDays.Length; i++)
            {
                Console.Write(WeekDays[i] + "\t");
            }
            Console.WriteLine("\n");
            for (int i = 0; i < monthCalendar.GetLength(0); i++)
            {
                for (int j = 0; j < monthCalendar.GetLength(1); j++)
                {
                    if (monthCalendar[i, j] == 0)
                    {
                        Console.Write("\t");
                    }
                    else
                    {
                        Console.Write("{0}\t", monthCalendar[i, j]);
                    }
                }
                Console.WriteLine();
            }
        }

        //Создать массив - размеры массива выбирает пользователь из консоли.
        //    Заполнить массив случайными числами в диапазоне от 1 до 20. 
        //    Вывести полученный массив на экран.
        //    Посчитать количество четных и нечетных элементов в массиве.

        static void CountOfEvenOddValues()
        {
            
            int countOdd = 0;
            int countEven = 0;
            int[,] resultArray = SizeAndRangeOfInitialArray();
            ArrayToPrintTwoDemencions(resultArray);
            for (int i = 0; i < resultArray.GetLength(0); i++)
            {
                for (int j = 0; j < resultArray.GetLength(1); j++)
                {
                    if (resultArray[i, j] % 2 == 0)
                    {
                        countEven++;
                    }
                    else
                    {
                        countOdd++;
                    }
                }
            }
            Console.WriteLine("Count of even elements in array: {0}.\nCount of odd elements in array: {1}.", countEven, countOdd);
        }
//        Создается массив из n строк и m столбцов.
//Найти: максимальный из наименьших элементов столбцов.

        static void FindMaxValueFromTheMinValues()
        {
            

            int[,] resultArray = SizeAndRangeOfInitialArray();
            ArrayToPrintTwoDemencions(resultArray);
            int maxNumber = Int32.MinValue;
            int minNumber = Int32.MaxValue;
            int i;
            for (int j = 0; j < resultArray.GetLength(1); j++)
            {
                for (i = 0; i < resultArray.GetLength(0); i++)
                {
                    if (resultArray[i, j] == 0)
                    {
                        minNumber = resultArray[i, j];
                    }
                    else if (resultArray[i, j] < minNumber)
                    {
                        minNumber = resultArray[i, j];
                    }
                    else
                    {
                        continue;
                    }
                }
                if (minNumber >= maxNumber)
                {
                    maxNumber = minNumber;
                }
                //else if (resultArray[i, j] > maxNumber)
                //{
                //    maxNumber = resultArray[i, j];
                //}
                else
                {
                    continue;
                }
            }
            Console.WriteLine("Max value from the min values of all colums: {0}", maxNumber);

        }

        //Создать двумерный массив, заполненный случайными числами.
        //После заполнения — показать заполненный массив на экран и посчитать сумму элементов отдельно в каждом столбце и каждой строке.

        static void SumOfElementsOfColumnsAndRows()
        {
            
            int[,] resultArray = SizeAndRangeOfInitialArray();
            ArrayToPrintTwoDemencions(resultArray);
            int[] sumOfRows = new int [resultArray.GetLength(0)];
            int[] sumOfColums = new int [resultArray.GetLength(1)];

            for (int i = 0; i < resultArray.GetLength(0); i++)
            {
                for (int j = 0; j < resultArray.GetLength(1); j++)
                {
                    sumOfColums[j] += resultArray[i, j];
                    sumOfRows[i] += resultArray[i, j];
                }
            }
            Console.WriteLine("The summ of elements in the colums:");
            foreach (int number in sumOfColums)
            {
                Console.Write("{0}\t", number);
            }
            Console.WriteLine();
            Console.WriteLine("The summ of elements in the rows:");
            foreach (int number in sumOfRows)
            {
                Console.WriteLine("\t{0}", number);
            }

            //Заполнить двумерный массив случайными числами от 10 до 100.
            //Посчитать сумму элементов отдельно в каждой строке и определить номер строки, в которой эта сумма максимальна.
        }

        static void FindIndxOfRowWithMaxSumm()
        {
           
            int[,] resultArray = SizeAndRangeOfInitialArray();
            ArrayToPrintTwoDemencions(resultArray);
            int[] sumOfRows = new int[resultArray.GetLength(0)];
            int[] sumOfColums = new int[resultArray.GetLength(1)];

            for (int i = 0; i < resultArray.GetLength(0); i++)
            {
                for (int j = 0; j < resultArray.GetLength(1); j++)
                {
                    sumOfRows[i] += resultArray[i, j];
                }
            }
            int maxValueOfSumRow = sumOfRows.Max();
            int indxOfMaxSummOfRow = Array.IndexOf(sumOfRows, maxValueOfSumRow);
            Console.WriteLine("The summ of elements in the rows:");
            foreach (int number in sumOfRows)
            {
                Console.WriteLine("\t{0}", number);
            }
            Console.WriteLine("The max summ from the rows is: {0}\nThe number of row where the summ is max: {1}", maxValueOfSumRow, (indxOfMaxSummOfRow + 1));
        }


        //Создать двумерный массив, заполненный случайными числами.Найти произведение ненулевых элементов массива.

        static void ProducOfNotZeroValues()
        {
            
            int[,] initialArray = SizeAndRangeOfInitialArray();
            ArrayToPrintTwoDemencions(initialArray);
            int productOfNotZeroElements = 1;

            for (int i = 0; i < initialArray.GetLength(0); i++)
            {
                for (int j = 0; j < initialArray.GetLength(1); j++)
                {
                    if(initialArray[i, j] == 0)
                    {
                        productOfNotZeroElements *= 1;
                    }
                    else
                    {
                        productOfNotZeroElements *= initialArray[i, j];
                    }
                  
                }
            }
            Console.WriteLine("The product of non-zero values is: {0}", productOfNotZeroElements);

        }

    }
}